package com.anolesoft.yr.mbus.sup.service.impl;

import com.anolesoft.yr.mbus.part.dto.PartModelDTO;
import com.anolesoft.yr.mbus.part.entity.PartModelDO;
import com.anolesoft.yr.mbus.sup.dto.SupBaseDTO;
import com.anolesoft.yr.mbus.sup.dto.SupBasePartDTO;
import com.anolesoft.yr.mbus.sup.dto.SupBasePartPriceDTO;
import com.anolesoft.yr.mbus.sup.entity.SupBaseDO;
import com.anolesoft.yr.mbus.sup.entity.SupBasePartDO;
import com.anolesoft.yr.mbus.sup.entity.SupBasePartPriceDO;
import com.anolesoft.yr.mbus.sup.mapper.SupBasePartPriceMapper;
import com.anolesoft.yr.mbus.sup.service.SupBasePartPriceService;
import com.anolesoft.yr.util.CommonUtils;
import com.anolesoft.yr.util.CustomBeanUtils;
import com.anolesoft.yr.util.PageData;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author zhj
 * @date 2020/8/12 10:28
 */
@Service("supBasePartPriceServiceImpl")
public class SupBasePartPriceServiceImpl implements SupBasePartPriceService {
    @Autowired
    private SupBasePartPriceMapper supBasePartPriceMapper;

    @Transactional
    @Override
    public int create(SupBasePartPriceDTO supBasePartPriceDTO) {
        return supBasePartPriceMapper.insert(SupBasePartPriceDO.builder()
                .objuid(supBasePartPriceDTO.getObjuid())
                .offerPerson(supBasePartPriceDTO.getOfferPerson())
                .supBasePartUid(supBasePartPriceDTO.getSupBasePartUid())
                .factoryCode(supBasePartPriceDTO.getFactoryCode())
                .remark(supBasePartPriceDTO.getRemark())
                .offerTime(supBasePartPriceDTO.getOfferTime())
                .offerPrice(supBasePartPriceDTO.getOfferPrice())
                .modifyUserUid(supBasePartPriceDTO.getModifyUserUid())
                .modifyTime(supBasePartPriceDTO.getModifyTime())
                .deleteFlag(supBasePartPriceDTO.getDeleteFlag())
                .dealPrice(supBasePartPriceDTO.getDealPrice())
                .createUserUid(supBasePartPriceDTO.getCreateUserUid())
                .createTime(supBasePartPriceDTO.getCreateTime())
                .build());
    }

    @Transactional
    @Override
    public int modify(SupBasePartPriceDTO supBasePartPriceDTO) {
        return supBasePartPriceMapper.update(SupBasePartPriceDO.builder()
                .objuid(supBasePartPriceDTO.getObjuid())
                .offerPerson(supBasePartPriceDTO.getOfferPerson())
                .supBasePartUid(supBasePartPriceDTO.getSupBasePartUid())
                .factoryCode(supBasePartPriceDTO.getFactoryCode())
                .remark(supBasePartPriceDTO.getRemark())
                .offerTime(supBasePartPriceDTO.getOfferTime())
                .offerPrice(supBasePartPriceDTO.getOfferPrice())
                .modifyUserUid(supBasePartPriceDTO.getModifyUserUid())
                .modifyTime(supBasePartPriceDTO.getModifyTime())
                .deleteFlag(supBasePartPriceDTO.getDeleteFlag())
                .dealPrice(supBasePartPriceDTO.getDealPrice())
                .createUserUid(supBasePartPriceDTO.getCreateUserUid())
                .createTime(supBasePartPriceDTO.getCreateTime())
                .build());
    }

    @Transactional
    @Override
    public int remove(String id) {
        return supBasePartPriceMapper.delete(id);
    }

    @Override
    public int removeBatch(List<String> ids) {
        int res = 0;
        for (String id : ids) {
            res += supBasePartPriceMapper.delete(id);
        }
        return res;
    }

    @Override
    public List<SupBasePartPriceDTO> selectAll() {
        return supBasePartPriceMapper.selectAll().stream().map(t -> CustomBeanUtils.supBasePartPriceDO2DTO(t)).collect(Collectors.toList());
    }

//    private SupBasePartPriceDTO do2dto(SupBasePartPriceDO t) {
//        if (t == null) {
//            return null;
//        }
//        return SupBasePartPriceDTO.builder()
//                .objuid(t.getObjuid())
//                .offerPerson(t.getOfferPerson())
//                .supBasePartUid(t.getSupBasePartUid())
//                .factoryCode(t.getFactoryCode())
//                .remark(t.getRemark())
//                .offerTime(t.getOfferTime())
//                .offerPrice(t.getOfferPrice())
//                .modifyUserUid(t.getModifyUserUid())
//                .modifyTime(t.getModifyTime())
//                .deleteFlag(t.getDeleteFlag())
//                .dealPrice(t.getDealPrice())
//                .createUserUid(t.getCreateUserUid())
//                .createTime(t.getCreateTime())
//                .build();
//    }

    @Override
    public PageData<List<SupBasePartPriceDTO>> selectAll(Integer limit, Integer curr) {
        Page<SupBasePartPriceDO> page = new Page<>(curr, limit);
        List<SupBasePartPriceDO> supBasePartPriceDOS = supBasePartPriceMapper.selectPageAll(page);
        List<SupBasePartPriceDTO> supBasePartPriceDTOS = supBasePartPriceDOS.stream().map(t -> CustomBeanUtils.supBasePartPriceDO2DTO(t)).collect(Collectors.toList());
        return new PageData<>(((int) page.getTotal()), supBasePartPriceDTOS);
    }

    @Override
    public Optional<SupBasePartPriceDTO> selectOneById(String id) {
        SupBasePartPriceDO supBasePartPriceDO = supBasePartPriceMapper.selectOneById(id);
        if (supBasePartPriceDO != null) {
            return Optional.of(CustomBeanUtils.supBasePartPriceDO2DTO(supBasePartPriceDO));
        }
        return Optional.empty();
    }

    @Override
    public List<SupBasePartPriceDTO> selectList(SupBasePartPriceDTO supBasePartPriceDTO) {
        SupBasePartPriceDO supBasePartPriceDO = buildCondition(supBasePartPriceDTO);
        return supBasePartPriceMapper.selectList(supBasePartPriceDO).stream().map(t -> CustomBeanUtils.supBasePartPriceDO2DTO(t)).collect(Collectors.toList());
    }

    private SupBasePartPriceDO buildCondition(SupBasePartPriceDTO supBasePartPriceDTO) {
        return SupBasePartPriceDO.builder()
                .factoryCode(supBasePartPriceDTO.getFactoryCode())
                .supBasePartUid(supBasePartPriceDTO.getSupBasePartUid())
                .offerPerson(supBasePartPriceDTO.getOfferPerson())
                .objuid(supBasePartPriceDTO.getObjuid())
                .build();
    }

    @Override
    public PageData<List<SupBasePartPriceDTO>> selectList(SupBasePartPriceDTO supBasePartPriceDTO, Integer limit, Integer curr) {
        Page<SupBasePartPriceDO> page = new Page<>(curr, limit);
        SupBasePartPriceDO supBasePartPriceDO = buildCondition(supBasePartPriceDTO);
        List<SupBasePartPriceDO> supBasePartPriceDOS = supBasePartPriceMapper.selectPageList(supBasePartPriceDO, page);
        List<SupBasePartPriceDTO> supBasePartPriceDTOS = supBasePartPriceDOS.stream().map(t -> CustomBeanUtils.supBasePartPriceDO2DTO(t)).collect(Collectors.toList());
        return new PageData<>(((int) page.getTotal()), supBasePartPriceDTOS);
    }

    @Override
    public PageData<List<SupBasePartPriceDTO>> selectPageConditionList(SupBasePartPriceDTO supBasePartPriceDTO, Integer limit, Integer curr) {
        Page<SupBasePartPriceDO> page = new Page<>(curr, limit);

        SupBasePartDTO supBasePart = supBasePartPriceDTO.getSupBasePart();
        SupBasePartDO supBasePartDO = SupBasePartDO.builder().build();

        SupBasePartPriceDO supBasePartPriceDO = SupBasePartPriceDO.builder().build();

        if(supBasePart!=null) {
            PartModelDTO partModel = supBasePart.getPartModel();
            SupBaseDTO supBase = supBasePart.getSupBase();
            if (partModel != null) {
                PartModelDO partModelDO = PartModelDO.builder()
                        .partCode(CommonUtils.warpStringNull(partModel.getPartCode()))
                        .partBrand(CommonUtils.warpStringNull(partModel.getPartBrand()))
                        .partModel(CommonUtils.warpStringNull(partModel.getPartModel()))
                        .partName(CommonUtils.warpStringNull(partModel.getPartName()))
                        .partSpecification(CommonUtils.warpStringNull(partModel.getPartSpecification()))
                        .partTypeUid(CommonUtils.stringNull(partModel.getPartTypeUid()))
                        .build();
                supBasePartDO.setPartModel(partModelDO);
            }
            if (supBase != null) {
                SupBaseDO supBaseDO = SupBaseDO.builder()
                        .supCode(CommonUtils.warpStringNull(supBase.getSupCode()))
                        .supName(CommonUtils.warpStringNull(supBase.getSupName()))
                        .supOtherName(CommonUtils.warpStringNull(supBase.getSupOtherName()))
                        .build();
                supBasePartDO.setSupBase(supBaseDO);
            }
            supBasePartDO.setSupBaseUid(CommonUtils.stringNull(supBasePart.getSupBaseUid()));
        }


        supBasePartPriceDO.setSupBasePart(supBasePartDO);
        supBasePartPriceDO.setObjuid(supBasePartPriceDTO.getObjuid());

        List<SupBasePartPriceDO> supBasePartPriceDOS = supBasePartPriceMapper.selectPageConditionList(supBasePartPriceDO, page);
        List<SupBasePartPriceDTO> supBasePartPriceDTOS = supBasePartPriceDOS.stream().map(t -> CustomBeanUtils.supBasePartPriceDO2DTO(t)).collect(Collectors.toList());
        return new PageData<>(((int) page.getTotal()), supBasePartPriceDTOS);
    }
}
